Hibernate Annotations হল Hibernate ORM ফ্রেমওয়ার্কে Java Persistence API (JPA) এর অ্যানোটেশনগুলির একটি সেট, যা ডেটাবেস টেবিলের সাথে Java ক্লাস এবং তাদের প্রপার্টি ম্যানেজ করতে ব্যবহৃত হয়। Hibernate-এ অ্যানোটেশন ব্যবহার করে আপনার কোড আরও ক্লিন এবং মেইনটেইনেবল হয়, কারণ আপনি XML কনফিগারেশন ফাইলের পরিবর্তে কোডে অ্যানোটেশন দিয়ে কনফিগারেশন করতে পারেন।
Hibernate অ্যানোটেশন ব্যবহার করে আপনি Entity ক্লাস তৈরি করতে পারেন এবং তার Primary Key, Relationships, Columns, Table Names, এবং আরও অনেক কনফিগারেশন ডেটাবেস টেবিলের সাথে ম্যাপ করতে পারেন।
এখানে Hibernate অ্যানোটেশনগুলি ব্যবহার করার পদ্ধতি এবং বিভিন্ন অ্যানোটেশন কীভাবে কাজ করে তা বিস্তারিতভাবে আলোচনা করা হবে।
Hibernate-এ একটি Entity হল এমন একটি ক্লাস যা ডেটাবেস টেবিলের সাথে সম্পর্কিত। @Entity
অ্যানোটেশন দিয়ে এটি চিহ্নিত করা হয়। ক্লাসের একটি প্রপার্টি সাধারণত Primary Key হিসেবে কাজ করে, এবং @Id
অ্যানোটেশন দিয়ে তা চিহ্নিত করা হয়।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "student") // Maps the Student class to the "student" table
public class Student {
@Id // Primary Key for the student
private int id;
private String name;
private String course;
// Constructors, Getters and Setters
public Student() { }
public Student(String name, String course) {
this.name = name;
this.course = course;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCourse() {
return course;
}
public void setCourse(String course) {
this.course = course;
}
}
@Entity
: এটি Hibernate কে বলে দেয় যে এই ক্লাসটি একটি Entity এবং এটি ডেটাবেস টেবিলের সাথে সম্পর্কিত।@Id
: এটি ক্লাসের ফিল্ডকে Primary Key হিসেবে চিহ্নিত করে।@Table
: এটি ডেটাবেস টেবিলের নাম নির্ধারণ করে। (যদি টেবিলের নাম ডিফল্ট নামের সাথে মেলে না তবে এটি প্রয়োজনীয় হয়)Hibernate-এ অ্যানোটেশন ব্যবহার করে টেবিলের কলামগুলির সাথে Java Bean প্রপার্টির mapping করা হয়। @Column
অ্যানোটেশনটি ব্যবহার করে আপনি কোন প্রপার্টি কোন কলামের সাথে ম্যাপ হবে তা নির্ধারণ করতে পারেন।
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "student")
public class Student {
@Id
private int id;
@Column(name = "student_name") // Maps the name field to the "student_name" column
private String name;
@Column(name = "course_name") // Maps the course field to the "course_name" column
private String course;
// Constructors, Getters and Setters
}
@Column
: এটি প্রপার্টিকে নির্দিষ্ট কলামের সাথে ম্যাপ করার জন্য ব্যবহৃত হয়। আপনি name
অ্যাট্রিবিউট ব্যবহার করে কলামের নাম নির্ধারণ করতে পারেন।Hibernate-এ সম্পর্কযুক্ত টেবিলের মধ্যে One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many সম্পর্কের জন্য বিভিন্ন অ্যানোটেশন রয়েছে। নিচে বিভিন্ন সম্পর্কের অ্যানোটেশন ব্যাখ্যা করা হলো।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity
public class Student {
@Id
private int id;
private String name;
@OneToOne
private Address address; // One-to-One relationship with Address
// Getters and Setters
}
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Course {
@Id
private int id;
private String courseName;
@OneToMany(mappedBy = "course") // One-to-Many relationship with Student
private List<Student> students;
// Getters and Setters
}
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class Student {
@Id
private int id;
private String name;
@ManyToOne
private Course course; // Many-to-One relationship with Course
// Getters and Setters
}
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
@Entity
public class Student {
@Id
private int id;
private String name;
@ManyToMany
private List<Course> courses; // Many-to-Many relationship with Course
// Getters and Setters
}
@OneToOne
: One-to-One সম্পর্ক নির্দেশ করে, যেখানে একটি টেবিলের এক রেকর্ড আরেকটি টেবিলের এক রেকর্ডের সাথে সম্পর্কিত থাকে।@OneToMany
: One-to-Many সম্পর্ক নির্দেশ করে, যেখানে একটি রেকর্ড অনেক রেকর্ডের সাথে সম্পর্কিত থাকে।@ManyToOne
: Many-to-One সম্পর্ক নির্দেশ করে, যেখানে অনেক রেকর্ড একটি রেকর্ডের সাথে সম্পর্কিত থাকে।@ManyToMany
: Many-to-Many সম্পর্ক নির্দেশ করে, যেখানে অনেক রেকর্ড অনেক রেকর্ডের সাথে সম্পর্কিত থাকে।Hibernate-এ Primary Key এর জন্য বিভিন্ন generation strategies ব্যবহার করা যায়, যেমন AUTO, IDENTITY, SEQUENCE, এবং TABLE।
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // Auto-generated Primary Key
private int id;
private String name;
private String course;
// Getters and Setters
}
GenerationType.IDENTITY
: ডেটাবেসে ইনক্রিমেন্টাল ভ্যালু ব্যবহার করে auto-increment প্রপার্টি।GenerationType.SEQUENCE
: ডেটাবেসে sequence ব্যবহার করে প্রাথমিক কী তৈরি করা হয়।GenerationType.TABLE
: একটি টেবিল ব্যবহার করে প্রাথমিক কী তৈরি করা হয় (কম ব্যবহৃত)।GenerationType.AUTO
: Hibernate ডেটাবেস ডায়ালেক্ট অনুযায়ী সঠিক স্ট্র্যাটেজি নির্বাচন করবে।Hibernate সম্পর্কিত ডেটা (যেমন একাধিক সম্পর্কিত অবজেক্ট) রিট্রিভ করতে fetching strategies ব্যবহার করা হয়। প্রধান দুটি স্ট্র্যাটেজি হল:
fetch = FetchType.EAGER
অ্যানোটেশনের মাধ্যমে নির্ধারণ করা হয়।fetch = FetchType.LAZY
অ্যানোটেশনের মাধ্যমে নির্ধারণ করা হয়।import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
@Entity
public class Course {
@Id
private int id;
private String courseName;
@OneToMany(fetch = FetchType.LAZY) // Lazy loading strategy
private List<Student> students;
// Getters and Setters
}
FetchType.LAZY
: লেজি লোডিং, অর্থাৎ সম্পর্কিত ডেটা কেবল তখনই লোড হবে যখন তা এক্সেস করা হবে।FetchType.EAGER
: এগার লোডিং, অর্থাৎ সম্পর্কিত ডেটা সেশন লোড হওয়ার সময়েই লোড হয়ে যাবে।Hibernate Annotations একটি শক্তিশালী এবং সহজ উপায় Hibernate ORM এর সাথে কাজ করার জন্য। এটি Entity Class Mapping, Relationship Mapping, Primary Key Generation, Fetching Strategies, এবং অন্যান্য ডেটাবেস কনফিগারেশন সম্পাদন করতে সাহায্য করে। Annotations ব্যবহারের মাধ্যমে আপনার কোড আরও সহজ, পরিষ্কার এবং রক্ষণাবেক্ষণযোগ্য হয়।
Hibernate Annotations হল একটি শক্তিশালী বৈশিষ্ট্য যা Hibernate ORM ফ্রেমওয়ার্কে Java classes এবং databases টেবিলের মধ্যে সম্পর্ক তৈরি করার জন্য ব্যবহৃত হয়। Hibernate annotations হল metadata বা মেটাডেটা ডিফিনিশন যা Hibernate কে জানায় যে একটি Java ক্লাস বা ফিল্ড কীভাবে একটি ডাটাবেস টেবিল বা কলামের সাথে সম্পর্কিত হবে।
Hibernate আগের সময়ে XML-based configuration ব্যবহার করত, তবে এখন annotations ব্যবহার করে কোডের মধ্যে সরাসরি metadata নির্ধারণ করা যায়, যা কোডকে আরও পরিষ্কার এবং কনফিগারেশনকে সহজ করে তোলে।
Hibernate Annotations ব্যবহার করে, আপনি Java classes এবং Java fields এর উপর অ্যানোটেশন প্রয়োগ করতে পারেন, যা Hibernate কে নির্দেশ দেয় কিভাবে ডেটাবেস টেবিল এবং কলামের সাথে সেই ক্লাস এবং ফিল্ডগুলির সম্পর্ক হবে।
এই অ্যানোটেশনগুলি ডেটাবেস টেবিলের নাম, প্রাইমারি কী, ফরেন কী, এবং অন্যান্য সম্পর্ক (One-to-One, One-to-Many, Many-to-Many) নির্ধারণ করতে ব্যবহৃত হয়। Hibernate annotations JPA (Java Persistence API) স্পেসিফিকেশন অনুযায়ী কাজ করে, যার মানে হল যে আপনি JPA annotations ব্যবহার করতে পারেন যা Hibernate এর সাথে কাজ করে।
Hibernate Annotations বিভিন্ন ধরনের অ্যানোটেশন প্রদান করে, যা বিভিন্ন ডেটাবেস সম্পর্ক এবং অ্যাট্রিবিউট কনফিগার করতে সাহায্য করে।
@Entity
এটি একটি Java class কে Hibernate entity হিসাবে চিহ্নিত করে। একটি @Entity
ক্লাস Hibernate কে জানায় যে এটি একটি টেবিলের সাথে সম্পর্কিত এবং এটি ডেটাবেসের persistent object।
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class User {
@Id
private int id;
private String name;
// Getters and Setters
}
এখানে, @Entity
অ্যানোটেশন User
ক্লাসকে ডেটাবেস টেবিলের সাথে সম্পর্কিত একটি Java entity হিসাবে চিহ্নিত করছে।
@Table
এটি একটি Java class কে ডেটাবেস টেবিলের সাথে ম্যাপ করার জন্য ব্যবহৃত হয়। @Table
অ্যানোটেশনটি টেবিলের নাম নির্ধারণ করতে ব্যবহৃত হয়। এটি ঐচ্ছিক (optional), তবে আপনি যদি টেবিলের নাম কাস্টমাইজ করতে চান, তাহলে এটি ব্যবহার করতে হবে।
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
@Entity
@Table(name = "user_table")
public class User {
@Id
private int id;
private String name;
// Getters and Setters
}
এখানে, @Table(name = "user_table")
টেবিলের নাম user_table
নির্ধারণ করে, যা ডেটাবেসে সংরক্ষিত হবে।
@Id
এটি একটি primary key ফিল্ডের জন্য ব্যবহৃত হয়। Hibernate এই ফিল্ডকে ডেটাবেস টেবিলের প্রাইমারি কী (primary key) হিসেবে চিহ্নিত করে।
@Id
private int id;
এখানে, id
ফিল্ডটিকে প্রাইমারি কী হিসেবে চিহ্নিত করা হয়েছে।
@GeneratedValue
এটি primary key ফিল্ডের মান স্বয়ংক্রিয়ভাবে জেনারেট করার জন্য ব্যবহৃত হয়। এটি সাধারণত auto-increment টাইপের প্রাইমারি কী ফিল্ডে ব্যবহৃত হয়।
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
এখানে, @GeneratedValue(strategy = GenerationType.IDENTITY)
Hibernate কে বলে যে id ফিল্ডের মান স্বয়ংক্রিয়ভাবে বৃদ্ধি হবে (যেমন auto-increment)।
@Column
এই অ্যানোটেশনটি Java fields এবং ডেটাবেস টেবিলের কলামগুলির মধ্যে সম্পর্ক তৈরি করে। আপনি টেবিলের কলামের নাম এবং অন্যান্য বৈশিষ্ট্য কাস্টমাইজ করতে এটি ব্যবহার করতে পারেন।
@Column(name = "user_name", length = 50, nullable = false)
private String name;
এখানে, @Column(name = "user_name")
name
ফিল্ডটি ডেটাবেস টেবিলের user_name
কলামের সাথে ম্যাপ করছে।
@OneToMany
, @ManyToOne
, @ManyToMany
, @OneToOne
এগুলি সম্পর্কিত অ্যানোটেশন, যেগুলি one-to-many, many-to-one, many-to-many, এবং one-to-one সম্পর্কের জন্য ব্যবহৃত হয়।
One-to-Many উদাহরণ:
@OneToMany(mappedBy = "department")
private List<Employee> employees;
এখানে, @OneToMany
অ্যানোটেশনটি Department
ক্লাসের employees
প্রপার্টি সম্পর্কিত Employee
ক্লাসের সাথে একাধিক Employee অবজেক্টের সম্পর্ক চিহ্নিত করছে।
@Transient
এই অ্যানোটেশনটি একটি ফিল্ডকে Hibernate থেকে সংরক্ষণ না করার জন্য ব্যবহৃত হয়। অর্থাৎ, এই ফিল্ডটি ডেটাবেসে কখনই সেভ হবে না।
@Transient
private String temporaryData;
এখানে, temporaryData
ফিল্ডটি Hibernate ক্যাশ বা ডেটাবেসে সংরক্ষিত হবে না।
Hibernate Annotations Hibernate ORM ফ্রেমওয়ার্কের জন্য অত্যন্ত শক্তিশালী একটি বৈশিষ্ট্য। এটি Java ক্লাসের মধ্যে সরাসরি metadata নির্ধারণ করতে সহায়তা করে, যা Hibernate কে জানায় কিভাবে ক্লাস এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করতে হবে। Annotations ব্যবহার করার ফলে কোড আরও পরিষ্কার, সহজ, এবং মেইন্টেনেবল হয়ে ওঠে, এবং এতে XML কনফিগারেশনের প্রয়োজনীয়তা কমে যায়। Hibernate annotations আপনাকে আপনার ডেটাবেস টেবিলের সাথে Java objects সম্পর্কিত করতে সহজ এবং দ্রুত উপায় প্রদান করে।
Hibernate, একটি Object-Relational Mapping (ORM) ফ্রেমওয়ার্ক, Java objects এবং relational database tables এর মধ্যে সম্পর্ক স্থাপন করতে সাহায্য করে। Hibernate এ Entity Classes এবং তাদের table mappings তৈরি করার জন্য বিভিন্ন annotations ব্যবহার করা হয়। এর মধ্যে সবচেয়ে গুরুত্বপূর্ণ @Entity, @Table, @Id, এবং @GeneratedValue। এই অ্যানোটেশনগুলি ডেটাবেস টেবিলের সাথে Java objects এর সম্পর্ক স্থাপন করতে ব্যবহৃত হয়।
এখানে আমরা এই অ্যানোটেশনগুলি কীভাবে ব্যবহার করতে হয় তা ব্যাখ্যা করব।
@Entity অ্যানোটেশনটি Hibernate কে বলে যে এই ক্লাসটি একটি Entity এবং এটি ডেটাবেসের টেবিলের সাথে সম্পর্কিত। এই অ্যানোটেশনটি ব্যবহার না করলে Hibernate ওই ক্লাসটিকে Entity হিসেবে চিনবে না।
import javax.persistence.*;
@Entity
public class Employee {
// Class definition
}
এখানে, @Entity অ্যানোটেশনটি Hibernate কে জানায় যে Employee ক্লাসটি একটি Entity এবং এটি ডেটাবেস টেবিলের সাথে সম্পর্কিত হবে।
@Table অ্যানোটেশনটি Hibernate কে বলে যে Entity ক্লাসটি কোন database table এর সাথে সম্পর্কিত হবে। এই অ্যানোটেশনটি সাধারণত @Entity অ্যানোটেশনের পরে ব্যবহৃত হয়, যদিও এটি optional (অপশনাল)।
@Entity
@Table(name="employee") // Maps the Employee class to the "employee" table
public class Employee {
// Class definition
}
এখানে:
employee
টেবিলের সাথে সম্পর্কিত।যদি আপনি @Table ব্যবহার না করেন, তবে Hibernate স্বয়ংক্রিয়ভাবে Entity ক্লাসের নামটিকে টেবিলের নাম হিসেবে ব্যবহার করবে। উদাহরণস্বরূপ, Employee ক্লাসের জন্য Hibernate
employee
নামে একটি টেবিল তৈরি করবে।
@Id অ্যানোটেশনটি Hibernate কে বলে যে কোন ফিল্ডটি primary key হবে। এই ফিল্ডটির মানের মাধ্যমে Entity অবজেক্টটিকে শনাক্ত করা হয়।
@Entity
@Table(name="employee")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="name")
private String name;
@Column(name="salary")
private double salary;
// Constructors, getters, and setters
}
এখানে:
id
ফিল্ডটিকে primary key হিসেবে চিহ্নিত করে।id
কে Entity ক্লাসের id
ফিল্ডের সাথে ম্যাপ করে।@Id অ্যানোটেশন ছাড়া Hibernate কোনো ফিল্ডকে primary key হিসেবে চিনবে না।
@GeneratedValue অ্যানোটেশনটি Hibernate কে বলে যে primary key এর মানটি স্বয়ংক্রিয়ভাবে তৈরি করা হবে (auto-generated)। সাধারণত, এটি @Id অ্যানোটেশনের সাথে ব্যবহৃত হয় এবং এটি সাধারণত auto-increment বা sequence (ডাটাবেস ডায়ালেক্ট অনুযায়ী) এর মাধ্যমে কাজ করে।
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // Auto-generate the primary key value
@Column(name="id")
private int id;
এখানে:
@GeneratedValue এর আরও কিছু স্ট্র্যাটেজি আছে:
এখানে একটি সম্পূর্ণ উদাহরণ দেওয়া হলো, যেখানে Employee
Entity ক্লাস তৈরি করা হয়েছে এবং বিভিন্ন Hibernate অ্যানোটেশন ব্যবহার করা হয়েছে।
import javax.persistence.*;
@Entity
@Table(name="employee") // Mapping the entity to the "employee" table
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // Auto-generate the primary key
@Column(name="id")
private int id;
@Column(name="name")
private String name;
@Column(name="salary")
private double salary;
// Constructors, getters, and setters
public Employee() {}
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- JDBC connection settings -->
<property name="hibernate.connection.driver_class">org.h2.Driver</property>
<property name="hibernate.connection.url">jdbc:h2:mem:testdb</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
<!-- Hibernate Dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
<!-- Show SQL queries -->
<property name="hibernate.show_sql">true</property>
<!-- Hibernate HBM2DDL -->
<property name="hibernate.hbm2ddl.auto">update</property>
</session-factory>
</hibernate-configuration>
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
public class MainApp {
public static void main(String[] args) {
// Create SessionFactory and Session
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
Session session = factory.getCurrentSession();
try {
// Create new Employee object
Employee employee = new Employee("John Doe", 50000);
// Start a transaction
session.beginTransaction();
// Save the employee object
session.save(employee);
// Commit the transaction
session.getTransaction().commit();
// Retrieve the employee based on the id
session = factory.getCurrentSession();
session.beginTransaction();
Employee retrievedEmployee = session.get(Employee.class, employee.getId());
System.out.println("Retrieved Employee: " + retrievedEmployee.getName());
// Commit the transaction
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Hibernate-এ @Entity, @Table, @Id, এবং @GeneratedValue অ্যানোটেশনগুলি মূল ভূমিকা পালন করে যখন Java objects এবং relational database tables এর মধ্যে সম্পর্ক তৈরি করা হয়। এই অ্যানোটেশনগুলির মাধ্যমে আপনি Java classes কে database tables এর সাথে সংযুক্ত করতে পারেন এবং ডেটাবেস অপারেশনগুলো অবজেক্ট-ওরিয়েন্টেড পদ্ধতিতে পরিচালনা করতে পারেন। Hibernate ORM এর মাধ্যমে primary key generation, entity mappings, এবং database schema সহজে পরিচালনা করা যায়।
Hibernate হল একটি ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক যা ডেটাবেস টেবিলগুলির মধ্যে সম্পর্ক পরিচালনা করার জন্য annotations এবং entity mappings ব্যবহার করে। Hibernate এর মাধ্যমে entity relationships যেমন @OneToOne, @OneToMany, @ManyToOne, এবং @ManyToMany সম্পর্কগুলি খুব সহজে নির্ধারণ করা যেতে পারে।
এগুলি হল Hibernate এর কিছু গুরুত্বপূর্ণ অ্যাসোসিয়েশন অ্যানোটেশন যা object-oriented রিলেশন তৈরি করতে সাহায্য করে। এখানে আমরা প্রতিটি সম্পর্কের ব্যাখ্যা এবং উদাহরণ দেখব।
@OneToOne সম্পর্ক তখন ব্যবহার হয় যখন একটি entity অন্য একটি entity এর সাথে একে অপরের সাথে একক সম্পর্ক স্থাপন করে। এই সম্পর্কটি primary key এর মাধ্যমে foreign key সম্পর্ক তৈরি করে। উদাহরণস্বরূপ, একজন ব্যক্তি একাধিক ব্যক্তিগত অ্যাড্রেসের পরিবর্তে একটি একক অ্যাড্রেস পেতে পারে।
Person.java (One-to-One):
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity
public class Person {
@Id
private int id;
private String name;
@OneToOne
private Address address;
// Constructors, getters, and setters
public Person() {}
public Person(int id, String name, Address address) {
this.id = id;
this.name = name;
this.address = address;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
// Other getters and setters
}
Address.java (One-to-One):
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Address {
@Id
private int id;
private String street;
// Constructors, getters, and setters
public Address() {}
public Address(int id, String street) {
this.id = id;
this.street = street;
}
// Getters and setters
}
ব্যাখ্যা:
Person
এবং Address
এর মধ্যে একে অপরের সাথে একক সম্পর্ক স্থাপন করা হয়েছে।Address
অবজেক্ট রয়েছে, যা একটি একক Address এর সাথে সম্পর্কিত।@OneToMany সম্পর্ক তখন ব্যবহার হয় যখন একটি entity একাধিক entity এর সাথে সম্পর্কিত থাকে। এই সম্পর্কটি ডেটাবেসের one-to-many রিলেশন তৈরি করে। উদাহরণস্বরূপ, একজন Author একাধিক Book এর সাথে সম্পর্কিত হতে পারে।
Author.java (One-to-Many):
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.Set;
@Entity
public class Author {
@Id
private int id;
private String name;
@OneToMany(mappedBy = "author")
private Set<Book> books;
// Constructors, getters, and setters
public Author() {}
public Author(int id, String name) {
this.id = id;
this.name = name;
}
public Set<Book> getBooks() {
return books;
}
public void setBooks(Set<Book> books) {
this.books = books;
}
// Other getters and setters
}
Book.java (Many-to-One):
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class Book {
@Id
private int id;
private String title;
@ManyToOne
private Author author;
// Constructors, getters, and setters
public Book() {}
public Book(int id, String title, Author author) {
this.id = id;
this.title = title;
this.author = author;
}
// Other getters and setters
}
ব্যাখ্যা:
Author
Entity ক্লাসে One-to-Many সম্পর্ক স্থাপন করা হয়েছে, যেখানে এক Author এর একাধিক Book থাকতে পারে।mappedBy = "author"
এই অ্যানোটেশনটি নির্দেশ করে যে, Book Entity ক্লাসে author
ফিল্ডটির মাধ্যমে এই সম্পর্কটি পরিচালিত হবে।@ManyToOne সম্পর্ক তখন ব্যবহার হয় যখন অনেকগুলি entity একটি entity এর সাথে সম্পর্কিত থাকে। এটি one-to-many সম্পর্কের বিপরীত এবং একটি entity এর প্রতি একাধিক entity সম্পর্কিত থাকতে পারে।
এটি পূর্বের Book এবং Author উদাহরণের অংশ।
Book.java (Many-to-One):
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class Book {
@Id
private int id;
private String title;
@ManyToOne
private Author author;
// Constructors, getters, and setters
public Book() {}
public Book(int id, String title, Author author) {
this.id = id;
this.title = title;
this.author = author;
}
public Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
// Other getters and setters
}
ব্যাখ্যা:
@ManyToMany সম্পর্ক তখন ব্যবহার হয় যখন একটি entity অন্য একাধিক entity এর সাথে সম্পর্কিত থাকে এবং সেই সম্পর্ক উভয় দিক থেকে একাধিক হতে পারে। এটি একটি many-to-many সম্পর্ক তৈরি করে, যেখানে একটি entity এর একাধিক রেকর্ড অনেক অন্য entity এর রেকর্ডের সাথে সম্পর্কিত হতে পারে।
Student.java (Many-to-Many):
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.Set;
@Entity
public class Student {
@Id
private int id;
private String name;
@ManyToMany
private Set<Course> courses;
// Constructors, getters, and setters
public Student() {}
public Student(int id, String name) {
this.id = id;
this.name = name;
}
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}
// Other getters and setters
}
Course.java (Many-to-Many):
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.Set;
@Entity
public class Course {
@Id
private int id;
private String title;
@ManyToMany(mappedBy = "courses")
private Set<Student> students;
// Constructors, getters, and setters
public Course() {}
public Course(int id, String title) {
this.id = id;
this.title = title;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
// Other getters and setters
}
ব্যাখ্যা:
mappedBy = "courses"
এই অ্যানোটেশনটি বলে দেয় যে Course Entity এর মধ্যে Student এর সম্পর্কটি পরিচালিত হবে।Association Type | Explanation | Annotations Used |
---|---|---|
One-to-One | A single entity is associated with another single entity. | @OneToOne |
One-to-Many | A single entity is associated with multiple entities. | @OneToMany , @ManyToOne |
Many-to-One | Multiple entities are associated with a single entity. | @ManyToOne |
Many-to-Many | Multiple entities are associated with multiple other entities. | @ManyToMany |
Hibernate-এ One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many অ্যাসোসিয়েশন অ্যানোটেশনগুলি বিভিন্ন ধরণের সম্পর্ক পরিচালনা করতে ব্যবহৃত হয়। Hibernate ORM এই সম্পর্কগুলিকে Java objects এবং database tables এর মধ্যে সম্পর্ক তৈরি করতে ব্যবহার করে, যা ডেটাবেসের সম্পর্কিত টেবিলের মধ্যে সঠিক ডেটা সঞ্চালনা সহজ করে তোলে।
Hibernate অ্যানোটেশনগুলির মাধ্যমে, আপনি সম্পর্কিত ডেটাবেস টেবিলগুলির মধ্যে mapping তৈরি করতে পারেন, যেমন foreign key, join table, এবং cascade operations সরাসরি ডিফাইন করা যায়।
Hibernate ORM (Object-Relational Mapping) Java objects এবং relational database tables এর মধ্যে সম্পর্ক তৈরি করার একটি শক্তিশালী টুল। Hibernate ORM ব্যবহার করে, Java objects (POJOs) কে database tables এর সাথে সম্পর্কিত করতে annotations ব্যবহার করা যায়, যা XML configuration এর পরিবর্তে আরো সহজ এবং কম্প্যাক্টভাবে mapping পরিচালনা করতে সহায়ক।
Hibernate annotations আপনাকে Java classes এবং database tables এর মধ্যে সম্পর্ক স্থাপন করতে, primary key, column mapping, এবং associations (relationships) নির্ধারণ করতে সাহায্য করে।
Hibernate-এ annotations ব্যবহার করে object-relational mapping কনফিগারেশন করা যেতে পারে, যেমন:
@Entity
: এই অ্যানোটেশনটি Hibernate কে জানায় যে এটি একটি entity এবং এটি ডেটাবেস টেবিলের সাথে সম্পর্কিত।@Table
: এটি database table এর নাম সুনির্দিষ্ট করে দেয়, যা Entity ক্লাসের সাথে সম্পর্কিত।@Id
: এটি টেবিলের primary key নির্ধারণ করে।@GeneratedValue
: এটি primary key-এর auto-generation স্ট্রাটেজি নির্ধারণ করে।@Column
: এটি ক্লাসের একটি ফিল্ডকে একটি column এর সাথে ম্যাপ করে।@OneToMany
, @ManyToOne
, @ManyToMany
, @OneToOne
: এই অ্যানোটেশনগুলি associations (relationship) ম্যাপ করতে ব্যবহৃত হয়।ধরা যাক, আমাদের একটি Employee
এবং Department
Entity Class রয়েছে, যেখানে One-to-Many relationship রয়েছে। এক Department একাধিক Employee এর সাথে সম্পর্কিত থাকতে পারে।
import javax.persistence.*;
@Entity
@Table(name = "employee")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "name")
private String name;
@Column(name = "salary")
private double salary;
@ManyToOne
@JoinColumn(name = "department_id") // Foreign key column for the Department entity
private Department department;
public Employee() {}
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
// Getters and setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
}
import javax.persistence.*;
import java.util.Set;
@Entity
@Table(name = "department")
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
private Set<Employee> employees;
public Department() {}
public Department(String name) {
this.name = name;
}
// Getters and setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Employee> getEmployees() {
return employees;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
}
Hibernate কনফিগারেশন ফাইলে ডেটাবেস সংযোগ এবং entity class এর ম্যাপিং নির্ধারণ করতে হবে। নিচে একটি সাধারণ hibernate.cfg.xml কনফিগারেশন ফাইলের উদাহরণ দেওয়া হলো:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- JDBC connection settings -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydatabase</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">password</property>
<!-- Hibernate dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- Enable batch processing -->
<property name="hibernate.jdbc.batch_size">20</property>
<!-- Enable second-level cache -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- Show SQL -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- Mapping the entity classes -->
<mapping class="com.example.model.Employee"/>
<mapping class="com.example.model.Department"/>
</session-factory>
</hibernate-configuration>
এখন, Hibernate ব্যবহার করে আমরা Employee এবং Department এর ইনস্ট্যান্স তৈরি এবং ডেটাবেসে সেভ করতে পারি।
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateApp {
public static void main(String[] args) {
// Create session factory
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.addAnnotatedClass(Department.class)
.buildSessionFactory();
// Create session
Session session = factory.getCurrentSession();
try {
// Create new Department object
Department department = new Department("IT");
// Create new Employee objects
Employee emp1 = new Employee("John Doe", 50000);
Employee emp2 = new Employee("Jane Doe", 60000);
// Set the department for each employee
emp1.setDepartment(department);
emp2.setDepartment(department);
// Start a transaction
session.beginTransaction();
// Save the department (this will also save the employees because of CascadeType.ALL)
session.save(department);
// Commit the transaction
session.getTransaction().commit();
System.out.println("Saved department and employees successfully!");
} finally {
factory.close();
}
}
}
@ManyToOne
: Employee
class-এ @ManyToOne
অ্যানোটেশন ব্যবহার করা হয়েছে, যা Employee
এবং Department
এর মধ্যে Many-to-One সম্পর্ক স্থাপন করে। অর্থাৎ, এক Department একাধিক Employee এর সাথে সম্পর্কিত হতে পারে।@OneToMany
: Department
class-এ @OneToMany
অ্যানোটেশন ব্যবহার করা হয়েছে, যা reverse সম্পর্ক বোঝায়। একটি Department এর একাধিক Employee থাকতে পারে, এবং এই সম্পর্কের জন্য mappedBy
ব্যবহার করা হয় যাতে Hibernate জানাতে পারে যে, সম্পর্কটি কিভাবে পরিচালিত হবে (এখানে Employee
class এর department
প্রপার্টি দ্বারা)।CascadeType.ALL
: এটি Employee
অবজেক্টের উপর cascade অপারেশন কার্যকর করে, অর্থাৎ যখন Department
সেভ হয়, তখন তার সাথে সম্পর্কিত Employees গুলি স্বয়ংক্রিয়ভাবে সেভ হয়ে যাবে।এখন, HQL (Hibernate Query Language) ব্যবহার করে, আপনি Department
এবং Employee
সম্পর্কিত ডেটা রিট্রিভ করতে পারেন। উদাহরণস্বরূপ:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import java.util.List;
public class HibernateApp {
public static void main(String[] args) {
// Create session factory
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.addAnnotatedClass(Department.class)
.buildSessionFactory();
// Create session
Session session = factory.getCurrentSession();
try {
// Start a transaction
session.beginTransaction();
// HQL query to get all employees in the "IT" department
Query<Employee> query = session.createQuery("from Employee e where e.department.name='IT'", Employee.class);
// Execute the query and get the result list
List<Employee> employees = query.getResultList();
// Display the employees
for (Employee emp : employees) {
System.out.println(emp.getName() + "
works in the " + emp.getDepartment().getName() + " department"); }
// Commit the transaction
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
---
### **Conclusion**
- Hibernate Annotations ব্যবহার করে **Entity Classes** এবং **database tables** এর মধ্যে সম্পর্ক স্থাপন করা সহজ এবং কার্যকর।
- **One-to-Many** সম্পর্ক তৈরি করার জন্য **`@OneToMany`** এবং **`@ManyToOne`** অ্যানোটেশনগুলি ব্যবহার করা হয়, যা Java objects এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক সঠিকভাবে ম্যাপ করে।
- Hibernate এ **HQL (Hibernate Query Language)** ব্যবহার করে আপনি Entity ক্লাসের মধ্যে সম্পর্কিত ডেটা সহজে রিট্রিভ করতে পারেন এবং ডেটাবেসের সাথে যোগাযোগ করতে পারেন।
Read more